const format = (date, fmt) => {
  var o = {
    'M+': date.getMonth() + 1, // 月份
    'd+': date.getDate(), // 日
    'h+': date.getHours(), // 小时
    'm+': date.getMinutes(), // 分
    's+': date.getSeconds(), // 秒
    'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
    'S': date.getMilliseconds() // 毫秒
  }
  if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
  for (var k in o) {
    if (new RegExp('(' + k + ')').test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
  }
  return fmt
}
const validateNumber = (val) => {
  return val.replace(/[^\?\d.]/g, '')
}
const validateNumberExceptPoint = (val) => {
  return val.replace(/[^\?\d]/g, '')
}
const jsonParse = (t, _type = 'object') => {
  if (_type === 'string') return t
  if (t && typeof t !== 'string') return t
  if (!t) {
    switch (_type) {
      case 'array':
        return []
      case 'string':
        return null
      default:
        return undefined
    }
  }
  try {
    t = JSON.parse(t)
    return t
  } catch (error) {
    console.error('jsonParse 转化错误:', t, error)
    switch (_type) {
      case 'array':
        return []
      case 'string':
        return null
      default:
        return undefined
    }
  }
}

const formatNumber = n => {
  n = n.toString()
  return n[1] ? n : '0' + n
}
const checkPhone = value => {
  if (!value) {
    return false
  }
  if (!(/^1[3456789]\d{9}$/.test(value))) {
    return false;
  } else {
    return true
  }
}
const getJoins = (arr = [], {
  key = '',
  sep = ','
}) => {
  if (!key) {
    return arr.join(sep)
  }
  let arrT = []
  for (const i of arr) {
    arrT.push(i[key])
  }
  return arrT.join(sep)
}

const isEmpty = function (obj) {
  if (typeof obj == undefined || obj == "null" || obj == "" || obj == null) {
    return true;
  } else {
    return false;
  }
}
/*函数节流*/
const throttle = function (fn, interval) {
  var enterTime = 0; //触发的时间
  var gapTime = interval || 300; //间隔时间，如果interval不传，则默认300ms
  return function () {
    var context = this;
    var backTime = new Date(); //第一次函数return即触发的时间
    if (backTime - enterTime > gapTime) {
      fn.call(context, arguments);
      enterTime = backTime; //赋值给第一次触发的时间，这样就保存了第二次触发的时间
    }
  };
}

/*函数防抖*/
const debounce = function (fn, interval) {
  var timer;
  var gapTime = interval || 200; //间隔时间，如果interval不传，则默认1000ms
  return function () {
    clearTimeout(timer);
    var context = this;
    var args = arguments; //保存此处的arguments，因为setTimeout是全局的，arguments不是防抖函数需要的。
    timer = setTimeout(function () {
      fn.call(context, args);
    }, gapTime);
  };
}
// 是否处于某一时间段内
function time_range(beginTime, endTime) {
  var strb = beginTime.split(":");

  if (strb.length != 3) {
    return false;
  }

  var stre = endTime.split(":");
  if (stre.length != 3) {
    return false;
  }

  var b = new Date();
  var e = new Date();
  var n = new Date();

  b.setHours(strb[0]);
  b.setMinutes(strb[1]);
  b.setSeconds(strb[2]);
  e.setHours(stre[0]);
  e.setMinutes(stre[1]);
  e.setSeconds(stre[2]);
  if (n.getTime() - b.getTime() > 0 && n.getTime() - e.getTime() < 0) {
    return true;
  } else {
    return false;
  }
}

function arraySlice(arr, num = 10) {
  let arrLength = arr.length; // 数组长度
  let index = 0;
  let newArr = []
  for (let i = 0; i < arrLength; i++) {
    if (i % num === 0 && i !== 0) { // 可以被 10 整除
      newArr.push(arr.slice(index, i));
      index = i;
    };
    if ((i + 1) === arrLength) {
      newArr.push(arr.slice(index, (i + 1)));
    }
  }
  return newArr
}
function addZero(str) { //行政区号专用
  if (!str) {
    return str
  }
  let s = str + ''
  let addZeroLength = 6 - s.length
  let addStr = ''
  for (let i = 0; i < addZeroLength.length; i++) {
    addStr += addStr + '0'
  }
  return s + addStr
}
function cutZero(str) { //行政区号专用
  if (!str) {
    return str
  }
  let s = str + ''
  s = s.replace(/(00|0000)$/g, "")
  return s
}
function compareVersion(v1, v2) {
  v1 = v1.split('.')
  v2 = v2.split('.')
  const len = Math.max(v1.length, v2.length)

  while (v1.length < len) {
    v1.push('0')
  }
  while (v2.length < len) {
    v2.push('0')
  }

  for (let i = 0; i < len; i++) {
    const num1 = parseInt(v1[i])
    const num2 = parseInt(v2[i])

    if (num1 > num2) {
      return 1
    } else if (num1 < num2) {
      return -1
    }
  }
  return 0
}
function paramsToObject(str) {
  let paramsList = str.split('&')
  let obj = {}
  paramsList.forEach(element => {
    let item = element.split('=')
    obj[item[0]] = item[1]
  });
  return obj
}
//地图计算两点距离
function getDistance(lat1, lng1, lat2, lng2) {
  lat1 = lat1 || 0;
  lng1 = lng1 || 0;
  lat2 = lat2 || 0;
  lng2 = lng2 || 0;

  var rad1 = lat1 * Math.PI / 180.0;
  var rad2 = lat2 * Math.PI / 180.0;
  var a = rad1 - rad2;
  var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;

  var r = 6378137;
  var distance = r * 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(rad1) * Math.cos(rad2) * Math.pow(Math.sin(b / 2), 2)));
  if (distance > 1000) {
    distance = Number(distance / 1000).toFixed(0) + 'km'
  } else {
    distance = Number(distance).toFixed(0) + 'm'
  }
  return distance;
}
module.exports = {
  checkPhone,
  jsonParse,
  format,
  getJoins,
  isEmpty,
  throttle,
  debounce,
  time_range,
  validateNumber,
  validateNumberExceptPoint,
  arraySlice,
  addZero,
  cutZero,
  compareVersion,
  paramsToObject,
  getDistance,
}